package KnowSparkSQL.DSL.MostValueAVGCountJoin;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.RelationalGroupedDataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

/**
 * 3.2.Dataset<Row>.groupBy(xxx)方法
 * 作用是按照指定的列名（一列或多列）对Dataset<Row>的数据进行分组。
 * 参数可以是字符串类型的可变参数。如groupBy(“institute”)表示按照学院进行分组。
 * 返回值是RelationalGroupedDataset类型对象。
 * 分完组，就可以统计每组数据的最值、平均值等信息。
 * 3.3.RelationalGroupedDataset.max(xxx)方法
 * 作用是求出每组中，指定列的最大值。
 * 参数是字符串类型的可变参数。如max(“age”)表示求出每组中，age这列的最大值。
 * 返回值是Dataset<Row>类型的对象
 * 3.4.RelationalGroupedDataset.min(xxx)方法
 * 作用是求出每组中，指定列的最小值。
 * 参数是字符串类型的可变参数。如min(“age”)表示求出每组中，age这列的最小值。
 * 返回值是Dataset<Row>类型的对象
 * 3.5.RelationalGroupedDataset.avg(xxx)方法
 * 作用是求出每组中，指定列的平均值。
 * 参数是字符串类型的可变参数。如avg(“age”)表示求出每组中，age这列的平均值。
 * 返回值是Dataset<Row>类型的对象
 * 3.6.RelationalGroupedDataset.count()方法
 * 作用是求出每个分组中，总共有多少行数据。
 * 不需要传递参数。如count()表示求出每个学院的学生总人数
 * （一行表示一个学生，有多少行就有多少个学生）
 * 返回值是Dataset<Row>类型的对象
 *
 * 3.7.Dataset<Row>.join(xxx)方法
 * 作用是按照指定列，内连接两个Dataset<Row>对象。
 * 参数可以是：第一个参数为要连接的Dataset<Row>对象，
 * 第二个参数为连接的列。如Dataset<Row>.join(Dataset<Row>, “institute”)
 * 表示按照学院将两个Dataset<Row>连接起来，返回一个新的Dataset<Row>对象。
 */
public class Demo {
    public static void main(String[] args) {
        SparkSession sparkSession = SparkSession.builder().appName(Demo.class.getName()).master("local").getOrCreate();

        Dataset<Row> json = sparkSession.read().json("./data/student.json");

        RelationalGroupedDataset groupedDataset = json.groupBy("institute");

        Dataset<Row> max = groupedDataset.max("age");
//        max.show();

        Dataset<Row> min = groupedDataset.min("age");
//        min.show();

        Dataset<Row> avg = groupedDataset.avg("age");

//        avg.show();

        Dataset<Row> count = groupedDataset.count();
//        count.show();

        max.join(min,"institute")
                .join(avg,"institute")
                .join(count,"institute")
                .selectExpr("institute as `学院`","`max(age)` as `最大年龄`","`min(age)`","round(`avg(age)`,2) as `avg(age)`","count")
                .show();




    }
}
